package coop.base.dao;
import java.util.ArrayList;
import java.util.List;

import junit.framework.TestCase;

import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.test.context.ContextConfiguration;
import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;
import org.springframework.test.context.transaction.TransactionConfiguration;

import coop.base.model.Barrio;
import coop.base.model.EstadoCivil;
import coop.base.model.EstadoDelPlano;
import coop.base.model.EstadoInformeUrbanistico;
import coop.base.model.MotivoIURegularizacion;
import coop.base.model.Ocupacion;
import coop.base.model.Partido;
import coop.base.model.Person;

@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(locations = "classpath:applicationContext.xml")
@TransactionConfiguration(defaultRollback = true, transactionManager = "transactionManager")
public class AppTestDao extends TestCase {

	@Autowired
	private PersonDao personDAO;
	
	@Autowired
	private PartidoDao daoPartido;
	
	@Autowired
	private BarrioDao daoBarrio;

	@Autowired
	private EstadoCivilDao daoEstadoCivil;
	
	@Autowired
	private EstadoDelPlanoDao daoEstadoDelPlano;
	
	@Autowired
	private OcupacionDao daoOcupacion;
	
	@Autowired
	private MotivoIURegularizacionDao daoMotivoIURegularizacion;
	
	@Autowired
	private EstadoInformeUrbanisticoDao daoEstadoInformeUrbanistico;
	
	
	@Test
	public void testPersona() {
		createPersona();
		getPersonaById();
		deletePersona();
	}
	
	@Test
	public void testPartidosYBarrios(){
		crearPartidos();
		recuperarPartidosCreados();
		crearBarrios();
		recuperarTodosLosBarrios();
		borrarTodosLosBarrios();
		borrarTodosLosPartidos();
	}

	@Test
	public void testEstadoCivil() {	
		getEstadoCivilById();
//		countEstadoCivil();
	}
	
	@Test
	public void testEstadoDelPlano() {	
		getEstadoDelPlanoById();
	}

	@Test
	public void testOcupacion() {	
		getOcupacionById();
	}
	
	@Test
	public void testEstadoInformeUrbanistico() {	
		getEstadoInformeUrbanisticoById();
	}
	
	@Test
	public void testMotivoIURegularizacion() {	
		getMotivoIURegularizacionById();
	}
	
	
	
	private void getMotivoIURegularizacionById() {
		MotivoIURegularizacion motivoIURegularizacion = daoMotivoIURegularizacion.get(531L);
		assertNotNull(motivoIURegularizacion);
		
	}

	private void getEstadoInformeUrbanisticoById() {
		EstadoInformeUrbanistico estadoiu = daoEstadoInformeUrbanistico.get(372L);
		assertNotNull(estadoiu);
		
	}

	private void getOcupacionById() {
		Ocupacion ocupacio = daoOcupacion.get(1L);
		assertNotNull(ocupacio);
		
	}

	private void getEstadoDelPlanoById() {
		EstadoDelPlano estadoDelPlano = daoEstadoDelPlano.get(1L);
		assertNotNull(estadoDelPlano);
		
	}

	public void countEstadoCivil() {
		List<EstadoCivil> estadosCiviles = daoEstadoCivil.getAll();
		assertEquals(7, estadosCiviles.size());
	}
	
	public void getEstadoCivilById() {
		EstadoCivil estadoCivil = daoEstadoCivil.get(1L);
		assertNotNull(estadoCivil);
	}
	
	
	public void getPersonaById() {
		Person emp = personDAO.get(1L);
		assertNotNull(emp);
	}

	public void createPersona() {
		Person persona = new Person();
		persona.setName("Pepe");
		personDAO.save(persona);

		Person personaRecuperada = personDAO.get(1L);

		assertTrue(personaRecuperada.getId() == 1L);
	}

	public void deletePersona() {
		personDAO.delete(personDAO.get(1L));
		assertTrue(personDAO.getAll().isEmpty());
	}
	
	public void crearPartidos(){
	        Partido laPlata = new Partido(55, "La Plata", "codCast055");
	        Partido deLacosta = new Partido(88, "La Costa", "codCast088");
	        
	        daoPartido.save(laPlata);
	        daoPartido.save(deLacosta);
	        assertTrue(daoPartido.get(1L) != null);
	}
	
	public void recuperarPartidosCreados(){
		 assertTrue(daoPartido.getAll().size()==2);
	}
	
	public void crearBarrios(){
	        
	        Barrio losHornos = new Barrio("Los Hornos", daoPartido.get(1L), "60 y 137");
	        Barrio tolosa = new Barrio("tolosa", daoPartido.get(1L), "2 y 530");
	        Barrio marDelTuyu = new Barrio("mar del tuyu",daoPartido.get(2L), "62 y costanera");
	        
	        daoBarrio.save(losHornos);
	        daoBarrio.save(tolosa);
	        daoBarrio.save(marDelTuyu);        

	        List<Barrio> barrios = daoBarrio.getAll(); 
	        assertTrue(barrios.size()==3);

	}
	
	public void recuperarTodosLosBarrios(){
	    List<Barrio> barrios = daoBarrio.getAll(); 
        assertTrue(barrios.size()==3);
	}
	
	public void borrarTodosLosBarrios(){
			List<Barrio> barrios = new ArrayList<Barrio>();
			for (Barrio barrio : barrios) {
				daoBarrio.delete(barrio);
			}
	}

	public void borrarTodosLosPartidos(){
		List<Partido> partidos = new ArrayList<Partido>();
		for(Partido partido: partidos){
			daoPartido.delete(partido);
		}
	}
}
